const { src, dest, series, parallel, watch } = require('gulp');
// 删除文件
const del = require('del');

// 引入 ES6 转换插件
const babel = require('gulp-babel');
// 压缩 JS 文件
const uglify = require('gulp-uglify')

// 压缩 HTML
const htmlmin = require('gulp-htmlmin');

// 将 less 转换成 CSS
const less = require('gulp-less')
    // 将 scss 转换成 CSS
var sass = require('gulp-sass')(require('sass'));
// 压缩 css
const csso = require('gulp-csso')

// 运行网络服务器的 Gulp 插件
const connect = require('gulp-connect')

// 处理 HTML 模板
const fileinclude = require('gulp-file-include');

const configPath = {
        jsPath: './src/home/js/',

        jsLibs: './src/assets/vendors/',
        jshomeJs: './src/home/js/home/',
        htmlcommonhtml: './src/home/common/',
        htmlPath: './src/home/',
        cssPath: './src/home/css/',
        imgPath: './src/home/img/',
        fontsPath: './src/home/fonts/',
        destfonts: './dist/home/fonts',
        destHtml: './dist/home',
        destCss: './dist/home/css',
        destImg: './dist/home/img',
        destJs: './dist/home/js',
        destJsLiibs: './dist/assets/vendors',
        destjshomeJs: './dist/home/js/home',
        desthtmlcommonHtml: './dist/home/common',
        jsAdminPath: './src/admin/js/',

        jsAdminLibs: './src/admin/libs/',
        htmlAdminPath: './src/admin/',
        cssAdminPath: './src/admin/css/',
        imgAdminPath: './src/admin/img/',

        destAdminHtml: './dist/admin',
        destAdminCss: './dist/admin/css',
        destAdminImg: './dist/admin/img',
        destAdminJs: './dist/admin/js',
        destAdminJsLiibs: './dist/admin/libs'
    }
    /*--------------------------   ------------------------------- */
function fonts() {
    return src(configPath.fontsPath + '**')
        .pipe(dest(configPath.destfonts))
        .pipe(connect.reload())
}

exports.fonts = fonts;

/*----------------------------- JS ----------------------------*/
function js() {
    return src(configPath.jsPath + '*.js')
        // ES6 转换
        .pipe(babel({ presets: ['@babel/env'] }))
        // 压缩 JS
        .pipe(uglify())
        .pipe(dest(configPath.destJs))
        .pipe(connect.reload());
}
exports.js = js

function Homejs() {
    return src(configPath.jshomeJs + '*.js')
        // ES6 转换
        .pipe(babel({ presets: ['@babel/env'] }))
        // 压缩 JS
        .pipe(uglify())
        .pipe(dest(configPath.destjshomeJs))
        .pipe(connect.reload());
}
exports.Homejs = Homejs

function adminjs() {
    return src(configPath.jsAdminPath + '*.js')
        // ES6 转换
        .pipe(babel({ presets: ['@babel/env'] }))
        // 压缩 JS
        // .pipe(uglify())
        .pipe(dest(configPath.destAdminJs))
        .pipe(connect.reload());
}
exports.adminjs = adminjs


function copyLibs() {
    return src(configPath.jsLibs + '**')
        .pipe(dest(configPath.destJsLiibs))
        .pipe(connect.reload())
}
exports.copyLibs = copyLibs

/*----------------------------- HTML ----------------------------*/
function html() {
    return src(configPath.htmlPath + '*.html')
        .pipe(fileinclude({
            prefix: '@@',
            basepath: '@file'
        }))
        // 压缩 HTML 去掉换行
        .pipe(htmlmin({ collapseWhitespace: true }))
        .pipe(dest(configPath.destHtml))
        .pipe(connect.reload())
}
exports.html = html

function commonHtml() {
    return src(configPath.htmlcommonhtml + '*.html')
        .pipe(fileinclude({
            prefix: '@@',
            basepath: '@file'
        }))
        // 压缩 HTML 去掉换行
        .pipe(htmlmin({ collapseWhitespace: true }))
        .pipe(dest(configPath.desthtmlcommonHtml))
        .pipe(connect.reload())
}
exports.commonHtml = commonHtml;

function adminhtml() {
    return src(configPath.htmlAdminPath + '*.html')
        .pipe(fileinclude({
            prefix: '@@',
            basepath: '@file'
        }))
        // 压缩 HTML 去掉换行
        .pipe(htmlmin({ collapseWhitespace: true }))
        .pipe(dest(configPath.destAdminHtml))
        .pipe(connect.reload())
}
exports.adminhtml = adminhtml

/*----------------------------- CSS ----------------------------*/
function css() {
    return src([configPath.cssPath + '*.less', configPath.cssPath + '*.scss', configPath.cssPath + '*.css'])
        // 转换 less
        .pipe(less())
        // 转换 scss
        .pipe(sass().on('error', sass.logError))
        .pipe(csso())
        .pipe(dest(configPath.destCss))
        .pipe(connect.reload())
}
exports.css = css

function admincss() {
    return src([configPath.cssAdminPath + '*.css'])
        .pipe(csso())
        .pipe(dest(configPath.destAdminCss))
        .pipe(connect.reload())
}
exports.admincss = admincss


function copyImg() {
    return src(configPath.imgPath + '*')
        .pipe(dest(configPath.destImg))
        .pipe(connect.reload())
}
exports.copyImg = copyImg

function copyadminImg() {
    return src(configPath.imgAdminPath + '*')
        .pipe(dest(configPath.destAdminImg))
        .pipe(connect.reload())
}
exports.copyadminImg = copyadminImg

// function copyMusic() {
//     return src('./src/music/*')
//         .pipe(dest('./dist/music'))
//         .pipe(connect.reload())
// }
// exports.copyMusic = copyMusic


// clean
function clean() {
    return del([configPath.destHtml + '/**']).then(() => {
        console.log('项目初始化清理完成...')
    })
}
exports.clean = clean

/*
    开发模式 启动服务
*/
// watch
function watchList() {
    watch(configPath.htmlPath + '*.html', series(html))
    watch(configPath.cssPath + '*.css', series(css))
    watch(configPath.imgPath + '*', series(copyImg))
    watch(configPath.jsPath + '*.js', series(js))
    watch(configPath.jsLibs + '*', series(copyLibs))
    watch(configPath.adminhtml + '*.html', series(adminhtml))
    watch(configPath.cssAdminPath + '*.css', series(admincss))
    watch(configPath.imgAdminPath + '*', series(copyadminImg))
    watch(configPath.jsAdminPath + '*.js', series(adminjs))
    watch(configPath.fontsPath + '*', series(fonts))
    watch(configPath.Homejs + '*.js', series(Homejs))
    watch(configPath.htmlcommonhtml + '*.html', series(commonHtml))

    // watch('./src/music/*', series(copyMusic))
}

// local server
let serverOptions = {
    name: 'development',
    root: './dist',
    host: 'localhost',
    port: 3001,
    livereload: true
}

function server() {
    connect.server(serverOptions)
}
exports.server = series(...init(), parallel(server, watchList))

function init() {
    return [clean, js, copyLibs, html, css, copyImg, adminhtml, admincss, copyadminImg, adminjs, fonts, Homejs, commonHtml] // , copyMusic
}

/*
    默认 组合 打包 所有任务
*/
exports.default = series(clean, js, copyLibs, html, css, copyImg, adminhtml, admincss, copyadminImg, adminjs, fonts, Homejs, commonHtml); // , copyMusic










/*------------------------------------------------------------------------------------------------*/

/*
    默认 指令
    gulp 直接执行 会默认执行导出的 default
*/
/*
function defaultTask(cb) {
    // 这是 我们的第一个 gulp 项目
    console.log('这是 我们的第一个 gulp 项目');
    cb();
  }
exports.default = defaultTask
*/


/*------------------------------------------------------------------------------------------------*/
/*
  通过 gulp 执行 导出 指令
  gulp test
*/
function test(cb) {
    console.log('这是测试函数');
    cb()
}
exports.test = test